#ifndef TMZ_H_
#define TMZ_H_

#ifndef __stdcall
#define __stdcall
#endif

#ifdef __cplusplus
extern "C" {
#endif
	//打开设备
	long __stdcall ICReaderOpenUsbByFD(unsigned int uiFD);
	long __stdcall ICReaderOpenCom(char *mntDevpath, unsigned int iBaud);
	
	
	//long __stdcall ICReaderOpenComEx(char *mntDevpath, unsigned int iBaud);
	
	long __stdcall ICReaderOpenUsbBySN(unsigned int uiFD,int ProNum);
	//关闭设备
	/**
	* @brief 关闭设备
	* 
	* @param[in] icdev:设备句柄
	* @param[out] 无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderClose(long icdev);

	//获取版本
	/**
	* @brief 获取版本
	* 获取读卡器固件版本
	* @param[in] icdev:设备句柄
	* @param[out] pVer:读卡器版本,可分配64字节. 
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderGetVer(long icdev, char *pVer);

	//蜂鸣器
	/**
	* @brief 蜂鸣器
	* 
	* @param[in] icdev:设备句柄
	* @param[in] uMsec:蜂鸣一次时间(100ms为基准),设置成1，就是蜂鸣100ms
	* @param[in] uDelay:蜂鸣间隔时间
	* @param[in] uNum:蜂鸣次数
	* @param[out] 无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderBeep(long icdev, unsigned char uMsec,
		unsigned char uDelay, unsigned char uNum);

	//序列号
	/**
	* @brief 读序列号
	*
	* @param[in] icdev:设备句柄
	* @param[out] pSN:设备一般存的是20字节序列号
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderReadDevSnr(long icdev, unsigned char rlen,char *pSN);
	
	//设置通讯波特率
	/**
	* @brief 设置通讯波特率
	* 设置成功，需要断开，重新连接设备.
	* @param[in] icdev:设备句柄
	* @param[in] module:0 : 接触模块 1：非接模块
	* @param[in] iBaud: 通讯波特率
	* @param[out] 无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderSetBaud(long icdev, unsigned char module, int iBaud);
	//设备状态
	/**
	* @brief 设备状态
	* 获取设备模块工作状态
	* @param[in] icdev:设备句柄
	* @param[out] uStatus:
	0 正常
	1 接触卡通道异常
	2 非接卡通道异常
	3 接触卡和非接卡通道异常
	4 安全模块通道异常
	5 接触卡和安全模块通道异常
	6 非接卡和安全模块通道异常
	7 接触卡、非接卡和安全模块通道异常
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderDevStatus(long icdev, unsigned char *uStatus);
	//EEPROM
	/**
	* @brief 读EEPROM
	* EEOPROM空间为200字节大小
	* @param[in] icdev:设备句柄
	* @param[in] iOffset:偏移地址
	* @param[in] iLen:长度
	* @param[out] pBuffer: EEPROM数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderReadEeprom(long icdev, int iOffset, int iLen,
		unsigned char *pBuffer);
	/**
	* @brief 写EEPROM
	* EEOPROM空间为200字节大小
	* @param[in] icdev:设备句柄
	* @param[in] iOffset:偏移地址
	* @param[in] iLen:长度
	* @param[in] pBuffer: EEPROM数据
	* @param[out] 无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderWriteEeprom(long icdev, int iOffset, int iLen,
		unsigned char *pBuffer);

	/*****************************CPU卡*****************************/
	//接触卡
	//获取接触式卡片状态
	/**
	* @brief 获取接触式卡片状态
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座 接触式用户卡：01H-0FH,PSAM卡：11H-1FH,非接卡31H-3FH
	* @param[out] uState :卡片状态
	0x3001 	//不支持卡类型
	0x3002 	//无卡
	0x3003 	//有卡已上电
	0x3004		//有卡未上电(未激活)
	0x3005 	//卡上电失败(激活失败)
	0x3006 	//操作卡片数据无回应（超时）
	0x3007 	//操作卡片数据出现错误
	0x3009 	//有多张卡在感应区
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall GetCardState(long icdev, unsigned char uSlot,
		int* uState);

	//获取卡片状态
	/**
	* @brief 获取接触非接模块是否有卡、安全模块是否存在

	* b7b6b5b4b3b2b1b0     b0为1表示接触通道有卡、b1为1表示非接有卡、b2为1表示安全模块存在
	* @param[in] icdev:设备句柄
	* @param[out] uState :卡片状态,一字节表示,根据bit位表示卡片状态
	bit0:为1表示接触有卡
	bit1:为1表示非接有卡
	bit2:为1表示安全模块存在
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall GetCardStateEx(long icdev,unsigned char *uState);

	//检测多卡状态
	/**
	* @brief 检测多卡状态
	* 
	* @param[in] icdev:设备句柄
	* @param[in] CheckCard: b7b6b5b4b3b2b1b0，bx为1表示对象需要查询 b0为1表示接触卡、b1为1表示非接卡、b2为1表示身份证、b3为1表示磁条卡
	* @param[out] uState :卡片状态
			0x0000		无卡
			0x0001		表示已刷磁卡
			0x0002		表示卡座存在接触式CPU卡
			0x0004		表示卡座存在接触式未知卡
			0x0008		表示感应区存在身份证
			0x0010		表示感应区存在激活前的Type A CPU卡或Type B CPU卡
			0x0020		表示感应区存在激活后的Type A CPU卡或Type B CPU卡
			0x0040		表示感应区存在激活前的M1卡
			0x0100		表示感应区存在激活前的多张Type A CPU卡
			0x0200		表示感应区存在激活前的多张M1卡
			0x0400		表示感应区同时存在激活前的Type A CPU卡和M1卡
			0x0800		表示刷磁卡失败
			0x1000		表示启动刷磁卡模式处于关闭状态
			0x2000		表示启动刷磁卡模式处于开启状态
			0x4000		表示感应区身份证激活前后状态一致
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall GetMulCardState(long icdev,unsigned char CheckCard,int* uState);

	//设置接触式卡上电复位波特率
	/**
	* @brief 设置接触式卡上电复位波特率
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座 接触式用户卡：01H-0FH,PSAM卡：11H-1FH
	* @param[in] iBaud 复位波特率: 9600，  38400， 115200
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICCSetResetBaud(long icdev, unsigned char uSlot, int iBaud);
	//设置非接触式卡数据传输速率
	/**
	* @brief 非接触式卡数据传输速率,协商速率失败将默认106kpbps
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座 非接0x31
	* @param[in] iBaud 传输速率: 0:106kbps(默认)、1:212kbps、2:424kbps、3:848kbps
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFCPUSetRate(long icdev,unsigned char uSlot, unsigned char iRate);
	/**
	* @brief 接触式卡上电复位
	*
	* @param[in] icdev:设备句柄
	* @param[in] iTime 等待插卡时间,毫秒.
	* @param[in] uSlot:卡座 接触式用户卡：01H,PSAM卡：11H-1FH RF:31H
	* @param[out] uType：非接卡类型
	* @param[out] uSnrLen：卡UID的长度
	* @param[out] pSnr：UID数据,一般4字节
	* @param[out] rLen :复位信息长度
	* @param[out] pData :复位信息
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall CPUPowerOn(long icdev, unsigned char uSlot, int iTime,
		unsigned char* uType, unsigned char* uSnrLen, unsigned char* pSnr,
		int* rLen, unsigned char* pData);
	//自适配速率对卡片上电
	int __stdcall CPUPowerOnRate(long icdev, unsigned char uSlot, int iTime,
		unsigned char* uType, unsigned char* uSnrLen, unsigned char* pSnr,
		int* rLen, unsigned char* pData);
	//接触式卡片下电
	/**
	* @brief 接触式卡片下电
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座 接触式用户卡：01H,PSAM卡：11H-1FH 
	* @param[out] 无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall CPUPowerOff(long icdev, unsigned char uSlot);

	//APDU
	/**
	* @brief APDU
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座,非接触式卡：31H，接触式卡：01H,PSAM卡：11H-1FH 
	* @param[in] sLen:  发送数据的字节长度
	* @param[in] pSendData:  发送的数据
	* @param[OUT] rLen: 接收数据的字节长度
	* @param[OUT] pData:接收的数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall CPUCardAPDU(long icdev, unsigned char uSlot, int sLen,
		unsigned char *pSendData, int* rLen, unsigned char* pData);
	/**
	* @brief 发送Cpu卡指令
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座,非接触式卡：31H，接触式卡：01H,PSAM卡：11H-1FH 
	* @param[in] sLen:  发送命令的字节长度
	* @param[in] pSendData:  发送的命令
	* @param[OUT] rLen: 返回的指令应答信息的字节长度
	* @param[OUT] pData:返回的指令应答信息
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall CPUCardTrn(long icdev,unsigned char uSlot,int sLen,unsigned char *pSendData,int* rLen,unsigned char* pData);
	/*****************************非接存储卡*****************************/
	//激活
	/**
	* @brief RFIC寻卡
	*
	* @param[in] icdev: 设备句柄
	* @param[in] iTime: 等待卡进入感应区时间（单位：毫秒）
	* @param[in] uType: 0AH  Type A 卡;  0BH  TypeB卡
	* @param[OUT] pSnr: 卡片UID
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICOpenCard(long icdev, int iTime, unsigned char* uType,
		unsigned char* uSnrLen, unsigned char* pSnr, unsigned char *pTagSak);

	//认证扇区
	/**
	* @brief RFIC认证
	*
	* @param[in] icdev: 设备句柄
	* @param[in] uMode: 认证模式 0 KEYA 模式 1 KEYB 模式
	* @param[in] uAdr: 扇区号
	* @param[in] pkey: 密码，6 字节.
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICAuth(long icdev, unsigned char uMode, int uAdr,
		unsigned char uKeylen, unsigned char *pkey);
	//块操作
	/**
	* @brief 读数据
	*
	* @param[in] icdev: 设备句柄
	* @param[in] uAdr: 块地址
	* @param[OUT]pValue:读出的值
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICBlockRead(long icdev, int uAdr, unsigned char *uLen,
		unsigned char* pValue);

	/**
	* @brief 写数据
	*
	* @param[in] icdev: 设备句柄
	* @param[in] uAdr: 块地址
	* @param[in]pValue:写的块值
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICBlockWrite(long icdev, int uAdr, unsigned char uLen,
		unsigned char* pValue);

	//读值块
	/**
	* @brief 获取非接触存储卡指定块地址的数值
	*
	* @param[in] icdev:设备句柄
	* @param[in] uAdr: 块地址
	* @param[OUT]pValue:读出块值
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICReadval(long icdev, int uAdr, unsigned long* uiValue);
	//写值块
	/**
	* @brief 写非接触存储卡指定块地址的数值
	*
	* @param[in] icdev:设备句柄
	* @param[in] uAdr: 块地址
	* @param[in]pValue:写的值
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICInitval(long icdev, int uAdr, unsigned long uiValue);
	//加值
	/**
	* @brief 对指定块地址的数据进行加值操作
	*
	* @param[in] icdev:设备句柄
	* @param[in] uAdr: 块地址
	* @param[in]pValue:写的值
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICIncrement(long icdev, int uAdr, unsigned long uiValue);
	//减值
	/**
	* @brief 对指定块地址的数据进行减值操作
	*
	* @param[in] icdev:设备句柄
	* @param[in] uAdr: 块地址
	* @param[in]pValue:写的值
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICDecrement(long icdev, int uAdr, unsigned long uiValue);
	//传送
	/**
	* @brief 非接触式存储卡值传送
	*
	* @param[in] icdev:设备句柄
	* @param[in] uAdr: 块地址
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall RFICTransfer(long icdev, int uAdr);
	/*****************************二代证*****************************/
	//获取安全模块ID
	/**
	* @brief 获取安全模块ID
	*
	* @param[in] icdev:设备句柄
	* @param[OUT] uLen: 模块数据长度
	* @param[OUT] pIDData: 模块数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall GetGAModeID(long icdev, unsigned char* uLen,
		unsigned char* pIDData);
	//获取身份证ID
	/**
	* @brief 获取身份证ID
	*
	* @param[in] icdev:设备句柄
	* @param[OUT] uLen: 模块数据长度
	* @param[OUT] pIDData: 模块数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall GetIDCardUID(long icdev, unsigned char* uLen,
		unsigned char *pIDData);

	//获取身份证原始数据
	/**
	* @brief 获取身份证原始数据
	* 
	* @param[in] icdev:设备句柄
	* @param[in] iFlag:指纹标志，0:不读指纹 1:读指纹
	* @param[OUT] pucCHMsg:	   身份证文字信息
	* @param[OUT] puiCHMsgLen: 身份证文字信息长度为256字节
	* @param[OUT] pucPHMsg:	   身份照片信息
	* @param[OUT] puiPHMsgLen: 身份证照片信息长度1024字节
	* @param[OUT] pucFPMsg:    身份证指纹信息
	* @param[OUT] puiFPMsgLen: 身份证指纹信息长度1024字节
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ReadIDCardBaseMsg(long icdev, int iFlag, unsigned char *pucCHMsg,
		int *puiCHMsgLen, unsigned char *pucPHMsg, int *puiPHMsgLen,
		unsigned char *pucFPMsg, int *puiFPMsgLen);

	//获取二代证基本信息
	/**
	* @brief 获取二代证基本信息
	*
	* @param[in] icdev:设备句柄
	* @param[in] iFlag:指纹标志，0:不读指纹 1:读指纹
	* @param[in] iBmpFormat:0 不保存照片路径 1:照片Base64码 2:保存照片
	* @param[in] pBmpFile: 身份证照片路径 （C:\\zp.bmp）或者 照片Base64码[需分配65536字节空间大小]，跟 iBmpFormat 配合使用.
	* @param[OUT] iType:  0:中国居民身份证 1:外国人永久居留身份证 2:港澳台居民居住证
	* @param[OUT] pSFZInfo: 身份证数据
	中国居民身份证数据格式如下:姓名|性别|民族|出生日期|住址|公民身份号码|签发机关|有效期起始日期|有效期截止日期|预留区|指纹信息|

	外国人永久居留身份证如下：英文姓名|性别|永久居留证号码|国籍或所在地代码|中文姓名|证件签发日期|证件终止日期|出生日期|证件版本号|单次申请受理机关代码|证件类型标识(I)|预留项|指纹信息|

	港澳台居民居住证数据格式如下:姓名|性别|出生日期|住址|公民身份号码|签发机关|有效期起始日期|有效期截止日期|通行证号码|签发次数|证件类型标识(J)|预留项|指纹信息|
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ReadIDCardBaseInfo(long icdev, int iFlag, int iBmpFormat,
		char *pBmpFile, int *iType, char *pSFZInfo, char *pFingerInfo);

	int __stdcall ParseIDCardInfo(unsigned char *pucCHMsg,int puiCHMsgLen,int *iType,char *pSFZInfo);
	int __stdcall ParseIDCardPic(unsigned char *pucPHMsg,int puiPHMsgLen,int iBmpFormat,char *pBmpFile);

	//获取身份证正反面图片
	int __stdcall GetIDCardFullBmp(int iType,char *pSFZInfo,int iBmpFormat,char *pZPInfo,char *pBmpFrontFile,char *pBmpBackFile,char *pBmpFile);

	/*****************************接触式存储卡***********************/
	//识别接触式存储卡种类
	/**
	* @brief 识别接触式存储卡种类
	*
	* @param[in] icdev:设备句柄
	* @param[in] uType:
	01H：AT24C01、AT24C02、AT24C04、AT24C08、AT24C16、ST14C02C、ST14C04C、GPM1K、GPM2K、GPM4K
	02H：45D041
	03H：SLE4418、SLE4428
	04H：SLE4432、SLE4442
	05H：AT24C32/64
	06H：93C46
	07H：AT153
	08H：AT102/AT1604
	09H：AT1608
	0AH：AT24C128/256
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICCheckCardType(long icdev, unsigned char uType);
	//接触式存储卡密钥初始化(更改密码)
	/**
	* @brief 更改密码
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座编号，1字节，接触式用户卡：01H-0FH， PSAM卡：11H-1FH
	* @param[in] uLen: pin的长度
	* @param[in] pPin: 密码数据
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICPwdChange(long icdev, unsigned char uLen, unsigned char* pPin);
	//接触式存储卡密码校验
	/**
	* @brief 密码校验
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座编号，1字节，接触式用户卡：01H-0FH， PSAM卡：11H-1FH
	* @param[in] uLen: pin的长度
	* @param[in] pPin: 密码数据
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICPwdCheck(long icdev, unsigned char uLen, unsigned char* pPin);
	//接触式存储卡读数据
	/**
	* @brief 接触式存储卡读数据
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座编号，1字节，接触式用户卡：01H-0FH， PSAM卡：11H-1FH
	* @param[in] uAdr: 偏移地址
	* @param[in] uLen: 读的长度
	* @param[OUT]pData：读的数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICRead(long icdev, int uAdr, int uLen, unsigned char* pData);
	//接触式存储卡写数据
	/**
	* @brief 接触式存储卡写数据
	*
	* @param[in] icdev:设备句柄
	* @param[in] uSlot:卡座编号，1字节，接触式用户卡：01H-0FH， PSAM卡：11H-1FH
	* @param[in] uAdr: 偏移地址
	* @param[in] uLen: 读的长度
	* @param[in]pData：写的数据
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICWrite(long icdev, int uAdr, int uLen, unsigned char* pData);

	//102、1604卡擦除、伪个人化、个人化这三个接口
	//擦除数据
	int __stdcall IC1604Clr(long icdev,int uAdr,int uLen);
	//伪个人化
	int __stdcall IC1604Person(long icdev,unsigned char uMode);
	//个人化
	int __stdcall IC1604Self(long icdev);

	//4442,4428
	//4428专用的是带保护位读
	//4442专用的是读保护位
	//4428、4442共用带保护位写

	//带保护位读写
	int __stdcall IC4428ProRead(long icdev,int uAdr,int uLen,unsigned char* pData);

	int __stdcall IC4428ProWrite(long icdev,int uAdr,int uLen,unsigned char* pData);

	//读写保护位
	int __stdcall IC4442ReadPB(long icdev,unsigned char* pData);
	int __stdcall IC4442WritePB(long icdev,int uAdr,int uLen,unsigned char* pData);//需要带数据写

	//读错误记数
	int __stdcall ICReadErrCount(long icdev,int uLen,unsigned char *pKeyType,unsigned char* uErrCount);
	/*****************************磁条卡***********************/
	//设置磁条模式
	/**
	* @brief 设置磁条模式
	*
	* @param[in] icdev:设备句柄
	* @param[in] uMode:磁条卡数据输出方式
	   				0x01：模拟键盘输出模式：
					 	0x11：命令输出模式；
						* @param[OUT]无
						* @return 成功等于0，失败返回其他
						**/
	int __stdcall SetMagCardMode(long icdev, unsigned char uMode);
	//读磁条卡
	/**
	* @brief 读磁条卡
	*
	* @param[in] icdev:设备句柄
	* @param[in] timeout:超时时间.毫秒
	* @param[OUT]uTrack1Len: 磁道1数据的长度
	* @param[OUT]pTrack1Data:磁道1数据
	* @param[OUT]uTrack2Len: 磁道2数据的长度
	* @param[OUT]pTrack2Data:磁道2数据
	* @param[OUT]uTrack3Len: 磁道3数据的长度
	* @param[OUT]pTrack3Data:磁道3数据
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ReadMagCard(long icdev, int timeout, int uMode, int *uTrack1Len,
		unsigned char *pTrack1Data, int *uTrack2Len, unsigned char *pTrack2Data,
		int *uTrack3Len, unsigned char *pTrack3Data);

	/*****************************密码键盘***********************/
	/**
	* @brief 读取密码键盘版本
	* 
	* @param[in] icdev:设备句柄
	* @param[OUT]pVer:密码键盘版本
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall KBGetVer(long icdev,char *pVer);

	//设置语音
	/**
	* @brief 设置语音
	* 
	* @param[in] icdev:设备句柄
	* @param[in]iVoice: 语音9条
	* @param[OUT]无
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall KBGetKBVoice(long icdev, unsigned char iVoice); 

	//获取明文密码
	/**
	* @brief 获取明文密码
	* 
	* @param[in] icdev:设备句柄
	* @param[in]uPinlen: pin的长度
	* @param[in]iTimeout: 超时时间秒
	* @param[OUT]pPin:获取的pin值
	* @return 成功等于0，失败返回其他
	**/
	//获取明文密码
	int __stdcall KBGetPin(long icdev, unsigned char uPinlen,unsigned char uTimeout,char *pPin);
	//工具函数
	/**
	* @brief 将 16 进制数转换为 ASCII 字符
	*
	* @param[in] hex:16 进制数据
	* @param[OUT]asc: ASCII 字符
	* @param[in] length: 16 进制数据的字节长度
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall Hex2Asc(unsigned char *hex, char *asc, int hexlen);
	/**
	* @brief 将 ASCII 字符转换为 16 进制数
	*
	* @param[in] asc:ASCII 字符
	* @param[OUT]hex:16 进制数据
	* @param[in] length: 16 进制数据的字节长度
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall Asc2Hex(char *asc, unsigned char *hex, int hexlen);

	//T5557卡 125KHZ
	int  __stdcall T5557ReadBlock(long icdev, unsigned char uPageNum,unsigned char uBlockNum,unsigned char *pBlockData,int *BlockDataLen);
	int  __stdcall T5557ReadBlockPwd(long icdev, unsigned char uPageNum,unsigned char uBlockNum,unsigned char *pKey,unsigned char *pBlockData,int *BlockDataLen);

	int  __stdcall T5557WriteBlock(long icdev, unsigned char uPageNum,unsigned char uBlockNum,unsigned char *pBlockData,int BlockDataLen);
	int  __stdcall T5557WriteBlockPwd(long icdev, unsigned char uPageNum,unsigned char uBlockNum,unsigned char *pKey,unsigned char *pBlockData,int BlockDataLen);
	int  __stdcall T5557ReadPage(long icdev, unsigned char uPageNum,unsigned char *pBlockData,int *BlockDataLen);

	int  __stdcall T5557ReadMoreUID(long icdev,unsigned char *UIDData,int *BlockDataLen,int *CardType);

	//银行卡号 + 姓名
	int __stdcall ReadBankCard(long icdev,unsigned char uSlot,char *pCardNo,char *pCardName);
	//发卡机构数据文件（EF05）
	int __stdcall ReadSIIssuerInfo(long icdev, unsigned char uSlot,char * pData);

	//个人基本信息文件(EF06)
	int __stdcall ReadSIPersonalInfo(long icdev,unsigned char uSlot,char * pData);
	//图片转换()
	int __stdcall ImageConvert(char *pSrcPath,char *pDesPath);

	//文件转Base64码
	int __stdcall FileToBase64(char *sFilePath,char *pBase64);
	//切换Bootload通道
	int __stdcall ICReaderNIAPSwitch(long icdev);
	//下载数据
	int __stdcall  ICReaderDownloadFile(long icdev,char *pFilePath);

	/**
	* @brief LED灯控制
	* 
	* @param[in] icdev:设备句柄
	* @param[in] uLEDCtrl:0 ,1, 2 (关, 开, 闪烁)
	* @return 成功等于0，失败返回其他
	**/
	int __stdcall ICReaderLEDCtrl(long icdev,unsigned char uLEDCtrl,unsigned char uDelay);

	//15693卡(电子标签)
	//寻卡
	int __stdcall RFIDCard(long icdev,unsigned char *pUID,int *UIDLen);

	//ECB模式
	int __stdcall DESEncrypt(unsigned char *pKey,int Keylen,unsigned char *pSource,int SrcLen,unsigned char *pDest,int *DestLen);
	int __stdcall DESDecrypt(unsigned char *pKey,int Keylen,unsigned char *pSource,int SrcLen,unsigned char *pDest,int *DestLen);

	//扫码
	int __stdcall  GetScanCodeVer(long icdev,char* pVer);
	int __stdcall  SetScanCodeMode(long icdev,unsigned char uMode);
	int __stdcall  GetScanCodeMode(long icdev,unsigned char *uMode);
	int __stdcall  GetScanCodeData(long icdev,int iTime,int *ilen,unsigned char* pCode);
	
	//打开外挂电脑USB键盘,返回设备句柄
	/**
	 * @brief 打开外挂USB密码键盘，密码键盘是USB直连电脑的.
	 * 
	 * @param[in]:无
	 * @param[OUT]:无
	 * @return 成功返回大于0的句柄，失败返回其他
	**/
	long __stdcall  KBOpen(unsigned int uiFD);
	//关闭USB键盘句柄
	/**
	 * @brief 关闭外挂USB密码键盘，密码键盘是USB直连电脑的.
	 * 
	 * @param[in] icdev:密码键盘返回的句柄
	 * @param[OUT]:无
	 * @return 成功返回大于0的句柄，失败返回其他
	**/
	int  __stdcall  KBClose(long icdev);
	
	//单独扫码头
	long __stdcall  OpenQRDev(char *mntDevpath, unsigned int iBaud);
	
	int  __stdcall  CloseQRDev(long qricdev); 
	
	//
	int __stdcall KBReset(long icdev);
	int __stdcall KBDownMainkey(long icdev,int iDestype,int iMainkeyNo,unsigned char *pMainkey);
	int __stdcall KBDownUserkey(long icdev, int iDestype, int iMainkeyNo, int iUserkeyNo, unsigned char *pUserkey);
	int __stdcall KBActiveKey(long icdev, int iMainkeyNo,int iUserkeyNo);
	int __stdcall KBGetEnpin(long icdev, unsigned char uPinlen,unsigned char uTimeout,char *pCardNo, unsigned char *pPin,unsigned char *uKeyNum);
	//转码函数
	/**
	 * @brief 字符串不同编码转换
	 * 
	 * @param[in] pFromCode:待转字符串编码，编码字符串如: UNICODE、UTF-8、UTF-16LE、UCS-2LE、GB18030、GBK、GB2312
	 * @param[in] pToCode:  目标字符串字符串编码
	 * @param[in] pFrombuf:   待转字符串
	 * @param[in] FromBuflen: 待转字符串长度
	 * @param[OUT] pToBuf:	 目标字符串
	 * @param[in/OUT] ToBufLen:目标字符串空间大小
	 * @param[OUT]:无
	 * @return 成功返回大于0的句柄，失败返回其他
	**/
	int __stdcall StringConvert(const char *pFromCode,const char *pToCode,char *pFrombuf, int FromBuflen, char *pToBuf, int *ToBufLen);
	//4G
	int __stdcall NetModuleTrans(long icdev,unsigned char uModule,int uTimeout,unsigned char *uNetData,int len,unsigned char *pData,int *rLen);
	int __stdcall NetModuleRest(long icdev,unsigned char uModule);

	//自动读卡
	int __stdcall SetAutoReadCard(long icdev,unsigned char uMode);
#ifdef __cplusplus
}
#endif

#endif
